<?php

namespace App\VModels;

use App\Models\MConfig;
use Illuminate\Database\Eloquent\Collection;

/**
 * VIP对象模型，虚拟对象，没有对应表结构
 */
class VVip
{
    /**
     * 标记VIP对象是否已经初始化完成
     */
    public static $initialized = false;

    /**
     * VIP对象关联的配置对象
     */
    public static $mConfig = null;

    /**
     * VIP对象构造方法
     */
    public function __construct($config = null)
    {
        self::init($config);
    }

    /**
     * 初始化VIP对象模型
     *
     * @param MConfig $config 通过配置对象解析出VIP对象
     */
    public static function init($config = null)
    {
        self::$initialized = true;  //标记已经初始化完成

        if (empty($config)) {
            if (empty(self::$mConfig)) {
                self::$mConfig = MConfig::getInstance(MConfig::TITLE_VIP);
            }
        } else {
            self::$mConfig = $config;
        }
    }

    /**
     * 返回会员的等级列表
     *
     * return Collection
     */
    private static function vipList()
    {
        $collect = new Collection();
        foreach (self::$mConfig->kvList as $slug => $value) {
            $vip = new VIP();
            $vip->slug = $value["slug"];
            $vip->name = $value["name"];

            //解析此等级的附加属性
            foreach ($value["attrs"] as $k => $v) {
                $k = $v["key"];
                $vip->$k = $v["val"];

            }
            $collect->add($vip);
        }
        return $collect;
    }

    /**
     * 根据Slug获取对应的会员等级信息
     */
    private static function findVipBySlug($slug)
    {
        if (empty($slug)) {
            return null;
        }

        $all = self::vipList();
        foreach ($all as $vip) {
            if ($vip->slug == $slug) {
                return $vip;
            }
        }
        return null;
    }

    /**
     * 根据Slug获取对应的会员等级的属性列表
     */
    private static function findAttrBySlug($slug)
    {
        $attrs = array();
        $vip = self::findVipBySlug($slug);
        if (!empty($vip)) {
            foreach ($vip as $key => $value) {
                if (!in_array($key, ["slug", "name"])) {
                    $attrs["$key"] = $value;
                }
            }
        }
        return $attrs;
    }

    /**
     * 根据会员对象的slug,获取到详细信息
     */
    private static function findDetailBySlug($slug)
    {
        $attrs = null;
        if (!empty($slug)) {
            $attrs = array();

            //先枚举会员的等级列表(找到对应的会员等级对象)
            foreach (self::$mConfig->kvList as $vipSlug => $value) {
                if ($slug == $vipSlug) {
                    foreach ($value["attrs"] as $k => $v) {
                        $attrs[] = $v;
                    }
                }
            }
        }
        return $attrs;
    }

    /**
     * 对外公开的静态API列表
     *
     * @param $name
     *
     * @param $arguments
     *
     * @return mixed 调用不同的函数，有不同的返回值
     */
    public static function __callStatic($name, $arguments)
    {
        //如果关联的config对象是假的，并且会员等级对象也是未初始化的，则先初始化会员等级对象
        if (!self::$initialized) {
            self::init();
        }

        //调用这些公开的API之前，必须确保config对象初始化成功
        if (!empty(self::$mConfig)) {

            if ($name == "getVipList") {
                return self::vipList();

            } elseif ($name == "vipBySlug") {
                return self::findVipBySlug($arguments[0]);

            } elseif ($name == "attrBySlug") {
                return self::findAttrBySlug($arguments[0]);

            } elseif ($name == "detailBySlug") {
                return self::findDetailBySlug($arguments[0]);

            }

        } else {
            return null;
        }
    }
}

/**
 * VIP对象
 */
class VIP
{
}